home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / et / src / menu.c < prev    next >
Text File  |  1993-07-08  |  10KB  |  401 lines

  1. #include  "et.h"
  2. void  main(int argc, char *argv[])/*et*/
  3. {
  4.   int   i, j, font_n, menu_n, menu_i, fdd, ram, col_al;
  5.   
  6.   fdd = ram = menu_i = 0;
  7.   custom(&ram, &menu_i, &G_nb.ps_r, &G_f);
  8.   while (argc--)
  9.     if ((*++argv)[0] == '-') {
  10.       i = *++(argv[0]);
  11.       switch (i) {
  12.       case 'i':
  13.       case 'I':
  14.         G_nb.ps_r = atoi(++(argv[0]));
  15.         break;
  16.       case 'm':
  17.       case 'M':
  18.         menu_i = *++(argv[0]);
  19.         break;
  20.       case 'v':
  21.         set_bit(G_f, f_VIEW);
  22.         break;
  23.       case 'V':
  24.         res_bit(G_f, f_VIEW);
  25.         break;
  26.       case 'r':
  27.         set_bit(G_f, f_RND);
  28.         break;
  29.       case 'R':
  30.         res_bit(G_f, f_RND);
  31.         break;
  32.       case 's':
  33.       case 'S':
  34.         res_bit(G_f, f_GPH);
  35.         set_bit(G_f, f_SV);
  36.         break;
  37.       case 't':
  38.       case 'T':
  39.         res_bit(G_f, f_SV);
  40.         set_bit(G_f, f_GPH);
  41.         break;
  42.       case 'u':
  43.       case 'U':
  44.         res_bit(G_f, f_SV|f_GPH);
  45.         break;
  46.       case 'w':
  47.       case 'W':
  48.         j = *++(argv[0]);
  49.         ram = islower(j) ? j - 'a' + 'A' : j;
  50.         init_dot(fdd, ram);
  51.         break;
  52.       case 'x':
  53.         set_bit(G_f, f_EXG);
  54.         break;
  55.       case 'X':
  56.         res_bit(G_f, f_EXG);
  57.         break;
  58.       }
  59.     }
  60.   init_main(&col_al, &ram, &fdd, &font_n, &menu_n);
  61.   init_et();
  62.   if (!test_bit(G_f, f_ERR)) {
  63.     init_dot(fdd, ram);
  64.     menu_i = init_start(menu_i);
  65.     switch(menu_i) {
  66.     case mn_DEMO:
  67.       init_dot(0, 0);
  68.       res_bit(G_f, f_RND|f_VIEW|f_EXG);
  69.       setjmp(G_jb);
  70.       while (test_bit(G_f, f_DEMO)) {
  71.         if (test_bit(G_f, f_ABORT))
  72.           res_bit(G_f, f_ABORT);
  73.         G_pn.demo = P_i[i_KEY_DEMO];
  74.         G_pn.key_fp = (char*)P_v[v_VIEW_2];
  75.         G_pn.csr_fp = (char*)((int)G_pn.key_fp + (int)P_i[i_SIZE_ICN][0]*10);
  76.         G_pn.fp = (char*)((int)G_pn.csr_fp + (int)P_i[i_SIZE_ICN][0]*10);
  77.         G_nb.key = G_nb.csr = 0;
  78.         load_key(0, 0);
  79.         disp_vram();
  80.         res_bit(G_f2, (f2_PNA|f2_FONT|f2_MOUSE));
  81.         res_bit(G_f, ~(f_VIEW|f_RND|f_EXG|f_SV|f_GPH|f_DEMO));
  82.         menu();
  83.         if (test_bit(G_f, f_GPH))
  84.           res_bit(G_f, f_GPH);
  85.         else if (test_bit(G_f, f_SV)) {
  86.           res_bit(G_f, f_SV);
  87.           set_bit(G_f, f_GPH);
  88.         } else {
  89.           if (test_bit(G_f, f_VIEW|f_RND))
  90.             res_bit(G_f, f_VIEW|f_RND);
  91.           else
  92.             set_bit(G_f, f_VIEW|f_RND);
  93.           if (test_bit(G_f, f_EXG))
  94.             res_bit(G_f, f_EXG);
  95.           else
  96.             set_bit(G_f, f_EXG);
  97.           shaff_dot(P_dot[dot_FREE_AREA]);
  98.           shaff_dot(P_dot[dot_FREE_SAVE]);
  99.           copy_dot(P_dot[dot_FREE_WORK], P_dot[dot_FREE_SAVE]);
  100.           set_bit(G_f, f_SV);
  101.         }
  102.       }
  103.       break;
  104.     case mn_MAKE:
  105.     case mn_REPLAY:
  106.     case mn_START:
  107.       setjmp(G_jb);
  108.       if (!test_bit(G_f, f_ERR)) {
  109.         res_bit(G_f, ~(f_VIEW|f_RND|f_EXG|f_SV|f_GPH|f_MAKE|f_REPLAY));
  110.         do {
  111.           if (test_bit(G_f, f_ABORT))
  112.             res_bit(G_f, f_ABORT);
  113.           disp_vram();
  114.           res_bit(G_f2, (f2_PNA|f2_FONT|f2_MOUSE));
  115.           menu();
  116.           kill_file(2);
  117.         } while (test_bit(G_f, f_REPLAY|f_ABORT) && !test_bit(G_f, f_ERR));
  118.       }
  119.       break;
  120.     defult:
  121.       break;
  122.     }
  123.   }
  124.   free_et();
  125.   term_et();
  126.   term_main(col_al, menu_i, font_n, menu_n);
  127. }
  128. void  term_main(int col_al, int menu_i, int font_n, int menu_n)/*et*/
  129. {
  130.   FILE  *File;
  131.   unsigned  f;
  132.   
  133.   if (G_nb.current == 16)
  134.     ;
  135.   else if (menu_i == mn_END) {
  136.     DEBUG("最大カーソル=", G_nb.max_edge, 10);
  137. #ifdef  N_FONT_LEN
  138. #else
  139.     DEBUG("N_FONT_LEN=", font_n, 10);
  140. #endif  /* N_FONT_LEN */
  141. #ifdef  N_MENU_NAME
  142. #else
  143.     DEBUG("N_MENU_NAME=", menu_n, 10);
  144. #endif  /* N_MENU_NAME */
  145.   } else if (!test_bit(G_f, f_ERR) && menu_i != mn_DEMO) {
  146.     P_c[c_FILE_KEY][9] = _DD;
  147.     P_c[c_FILE_CSR][9] = _DD;
  148.     P_c[c_FILE_ICN_KEY][9] = _DD;
  149.     P_c[c_FILE_ICN_CSR][9] = _DD;
  150.     kill_file(1);
  151.     P_c[c_FILE_KEY][9] = '_';
  152.     P_c[c_FILE_CSR][9] = '_';
  153.     P_c[c_FILE_ICN_KEY][9] = '_';
  154.     P_c[c_FILE_ICN_CSR][9] = '_';
  155.     kill_file(3);
  156.     if ((File = fopen(P_c[c_FILE_REPLAY], "ab")) != NULL) {
  157.       fclose(File);
  158.       f = f_REPLAY;
  159.       File = fopen(P_c[c_FILE_REPLAY], "ab");
  160.       fseek(File, 0L, 0);
  161.       et_fwrite(&f, sizeof(unsigned), 1, File);
  162.       fclose(File);
  163.     } 
  164.   }
  165.   if (G_nb.current != 16 && !test_bit(G_f, f_ERR)) {
  166.     set_file_i(&P_c[c_FILE_BAK][8], 0);
  167.     unlink(P_c[c_FILE_BAK]);
  168.   }
  169.   MOS_end();
  170.   _volume();
  171.   goto_current();
  172.   _set_console(0x1b, col_al);
  173.   _set_console(0xb, 0);
  174.   screenterm();
  175. }
  176. void  menu()/*et*/
  177. {
  178.   int   i, j, key, key_i, replay_i, dev_b;
  179.   static int file_n = 0;
  180.   
  181.   replay_i = init_menu(&file_n);
  182.   key_i = nb_key(G_mv);
  183.   dev_b = -1;
  184.   do {
  185.     key = inkey(GETCH);
  186.     if ((i = instring(key, P_i[i_KEY_MOVE], sizeof(int))) != 0) {
  187.       res_bit(G_f, f_RR);
  188.       j = move_et(i, key_i);
  189.       switch(j) {
  190.       case _TAB:
  191.         exg_et();
  192.         break;
  193.       case _INS:
  194.         break;
  195.       case 0:
  196.         disp_trace();
  197.         break;
  198.       }
  199.       key_i++;
  200.       G_mv[key_i].key = EOK;
  201.       if (key_i == 1 || key_i >= MAX_KEY) {
  202.         if (key_i == 1) {             /* == disp_menu(0, NULL, 0) */
  203.           dev_b = -1;
  204.           G_nb.mn = set_nb_menu();
  205.           draw_edge(P_SET, AFT);
  206.           for (i = 2; i; i--, exchange_page()) {
  207.             if (i == 1) {
  208.               copy_window(P_i[i_WIN_MENU], P_v[v_VRAM], 0x14, POKE);
  209.               continue;
  210.             }
  211.             draw_mode(2, mn_BS, L_WHT);
  212.             draw_mode(2, mn_SS, L_WHT);
  213.             draw_mode(2, mn_EE, L_WHT);
  214.             copy_window(P_i[i_WIN_MENU], P_v[v_VRAM], 0x14, PEEK);
  215.           }
  216.           draw_edge(P_RES, AFT);
  217.         } else {
  218.           dev_b = -1;
  219.           draw_edge(P_SET, AFT);
  220.           disp_menu(0, NULL, 6, 0);
  221.         }
  222.       } else {
  223.         i = N_LAST_DOT * key_i / MAX_KEY;
  224.         if (dev_b != i) {
  225.           dev_b = i;
  226.           draw_edge(P_SET, AFT);
  227.           for (i = 2; i; i--, exchange_page())
  228.             draw_free(0);
  229.           draw_edge(P_RES, AFT);
  230.         }
  231.       }
  232.     } else {
  233.       key = sub_menu(key, &file_n);
  234.       key_i = nb_key(G_mv);
  235.     }
  236.   } while (key != S_ESC);
  237.   term_menu(file_n, replay_i);
  238. }
  239. void  term_menu(int file_n, int replay_i)/*et*/
  240. {
  241.   FILE  *File, *Temp;
  242.   int   replay_n;
  243.   
  244.   if (!test_bit(G_f, f_DEMO)) {
  245.     copy_window(P_i[i_WIN_VIEW], P_v[v_VIEW_0], 0x120, PEEK);
  246.     if (!test_bit(G_f, f_REPLAY|f_MAKE)) {
  247.       File = fopen(P_c[c_FILE_REPLAY], "ab");
  248.       fseek(File, replay_i, 0);
  249.       Temp = fopen(P_c[c_FILE_ET_TEMP], "rb");
  250.       fseek(Temp, 0L, 2);
  251.       replay_i = ftell(Temp);
  252.       fseek(Temp, 0L, 0);
  253.       copy_file(File, Temp, replay_i);
  254.       fclose(Temp);
  255.       replay_n = ftell(File);
  256.       fclose(File);
  257.     }
  258.     if (test_bit(G_f, f_REPLAY))
  259.       kill_file(1);
  260.     else {
  261.       copy_buffer(6, STORE, &file_n, replay_n);
  262.       if (test_bit(G_f, f_MAKE)) {
  263.         res_bit(G_f, f_MAKE);
  264.         set_bit(G_f, f_ABORT);
  265.       }
  266.     }
  267.   }
  268. }
  269. int   sub_menu(int key, int *file_n_p)/*et*/
  270. {
  271.   int   i, j, menu_i;
  272.   
  273.   menu_i = (find_key(key))->n;
  274.   switch(menu_i) {
  275.   case mn_ESC:
  276.     key = end_menu(menu_i);
  277.   case mn_S_ESC:
  278.     break;
  279.   case mn_SS:
  280.     save(menu_i, file_n_p);
  281.     break;
  282.   case mn_LL:
  283.     load(menu_i, file_n_p);
  284.     break;
  285.   case mn_CC:
  286.     save_key(-1);
  287.     cursol(menu_i);
  288.     break;
  289.   case mn_EE:
  290.   case mn_S_EE:
  291.     save_key(-1);
  292.     set_bit(G_f, f_EE);
  293.     j = menu_i == mn_EE;
  294.     if (!j)
  295.       menu_i = mn_EE;
  296.     if (test_bit(G_f, f_NN))
  297.       j = !j;
  298.     enter(menu_i, j);
  299.     res_bit(G_f, f_EE);
  300.     break;
  301.   case mn_RR:
  302.   case mn_S_RR:
  303.     stereo(menu_i);
  304.     break;
  305.   case mn_FF:
  306.     save_key(-1);
  307.     font(menu_i);
  308.     break;
  309.   case mn_POS:
  310.     if (test_bit(G_f, f_VIEW)) {
  311.       if (test_bit(G_f, f_SV|f_GPH))
  312.         G_pn.range_lt = G_pn.range_rt = NULL;
  313.       else
  314.         G_pn.range = NULL;
  315.       res_bit(G_f, f_VIEW);
  316.       draw_edge(P_SET, AFT);
  317.       for (i = 2; i; i--, exchange_page())
  318.         for (j = -4; j <= -1; j++)
  319.           cls_frame(P_i[i_WIN_VIEW], j, H_WHT, P_RES);
  320.       draw_edge(P_RES, AFT);
  321.     } else {
  322.       set_bit(G_f, f_VIEW);
  323.       if (test_bit(G_f, f_SV|f_GPH)) {
  324.         cul_edge(G_et, G_edge, G_nb.edge, _LT, 0);
  325.         cul_edge(G_et, G_bf.edge, G_nb.edge, _RT, 0);
  326.       } else
  327.         cul_edge(G_et, G_edge, G_nb.edge, 0, 0);
  328.       exchange_page();
  329.       draw_edge(P_RES, AFT);
  330.     }
  331.     break;
  332.   case mn_RND:
  333.     if (test_bit(G_f, f_RND))
  334.       res_bit(G_f, f_RND);
  335.     else
  336.       set_bit(G_f, f_RND);
  337.     shaff_dot(P_dot[dot_FREE_AREA]);
  338.     shaff_dot(P_dot[dot_FREE_SAVE]);
  339.     copy_dot(P_dot[dot_FREE_WORK], P_dot[dot_FREE_SAVE]);
  340.     draw_edge(P_SET, AFT);
  341.     paint_free(2);
  342.     copy_window(P_i[i_WIN_VRAM], P_v[v_VRAM], 0x14, PEEK);
  343.     exchange_page();
  344.     copy_window(P_i[i_WIN_VRAM], P_v[v_VRAM], 0x14, POKE);
  345.     exchange_page();
  346.     draw_edge(P_RES, AFT);
  347.     break;
  348.   case mn_AA:
  349.   case mn_NN:
  350.   case mn_OO:
  351.   case mn_BAR:
  352.     trace(menu_i);
  353.     break;
  354.   case mn_PP:
  355.   case mn_DD:
  356.   case mn_XX:
  357.   case mn_YY:
  358.   case mn_ZZ:
  359.   case mn_GG:
  360.     save_key(-1);
  361.     change(menu_i);
  362.     break;
  363.   case mn_AT:
  364.     change(menu_i);
  365.     break;
  366.   case mn_WW:
  367.     set_bit(G_f, f_WW);
  368.     if (test_bit(G_f, f_AA) && nb_key(G_mv))
  369.       set_ww(menu_i);
  370.     else
  371.       change(menu_i);
  372.     res_bit(G_f, f_WW);
  373.     break;
  374.   case mn_TT:
  375.     save_key(-1);
  376.     copy_pna(menu_i);
  377.     break;
  378.   case mn_S_BS:
  379.     save_key(-1);
  380.     clear(menu_i);
  381.     break;
  382.   case mn_BS:
  383.     delete(menu_i);
  384.     break;
  385.   }
  386.   return(key);
  387. }
  388. int   end_menu(int menu_i)/*et*/
  389. {
  390.   int   key;
  391.   
  392.   disp_menu(menu_i, NULL, 11, 0);
  393.   while ((key = inkey(WINK)) == 0)
  394.     ;
  395.   if (key == _ESC)
  396.     disp_menu(menu_i, NULL, 6, 0);
  397.   else
  398.     key = S_ESC;
  399.   return(key);
  400. }
  401.